Vue.js
ItIron2020
我們在之前認識了vue實體、vue組件以及如何在父子層的組件透過props & emit相互溝通,作為額外補充還簡單介紹了一下slot的概念,也因此體會到了vue組件的方便。今天則要介紹SFC的概念,可謂vue的核心概念之一,但內容並不困難,不用擔心! 我們馬上就開始吧!
single file components是一個vue檔案,每一個vue檔案就是一個完整的組件,其中包含著三大部分
一個SFC會有著以下的結構
<template>
<div>
<!--HTML-->
</div>
</template>
<script>
// JAvaScript
</script>
<style>
/*CSS*/
</style>
很眼熟對吧,是的。我們目前用的vue pen就是一個標準的SFC~! surprised!
我們在之前的練習中了解到註冊全域vue組件、以及組件的方便性,不過如果你當時有自己註冊過一個全域組件,例如我們昨天的slot範例。
Vue.component("post", {
template: `
<div>
<slot name="title"></slot>
<slot name="body"></slot>
<slot></slot>
</div>
`,
});
這樣的作法有著一些缺點
template區塊的內容就是你在註冊全域組件時寫入的字串,它經過編譯之後會有一模一樣的結果。 一個template只能有一個根元素(root element),也就是說所有的內容都要用一個容器包起來,比如說
<template>
<div>
<!--這樣的寫法就是OK的-->
</div>
</template>
<template>
<div>
<h1>我是Danny</h1>
</div>
<div>
<!--這樣的寫法就是出局的-->
</div>
</template>
值得一提的是,正式上線的Vue3.0以及移除了只能有一個根元素的限制,這點我們會在鐵人賽的最後一併探討:D
template預設的markup是HTML,不過你也可以藉由lang屬性改寫為你習慣的樣板。
<template lang="pug">
div
Hello world
</template>
script區塊就是我們之前探討的各種vue屬性與hooks,一個SFC內只能有一個script區塊,且最終需要輸出成一個vue實體,若你有需要引入外部的js檔案,則可以使用require或是import達成。以下是script標籤內的基本架構
import dayjs from 'dayjs' // 引入npm套件
import {helper} from '../utils.js' // 以相對路徑引入自己專案內的js檔案
export default {
data() {
return {
};
},
methods: {
},
computed: {
},
mounted() {
}
};
</script>
一個SFC內可以有著複數個style,特別注意的是預設的style是全域管理,如果你只希望在這個組件中套用指定的樣式,可以加入scoped屬性
<style scoped>
/*CSS*/
</style>
同時你也可以利用lang屬性套用想要的預處理器,像是scss或是stylus之類的(在此之前記得要先透過npm安裝對應的預處理器與loader)
<style lang="stylus" scoped>
/*CSS*/
</style>
在SFC內使用其他的vue組件分成幾個部分,首先你需要先透過import載入指定的組件,假設現在有兩個SFC,分別是A、B兩個組件,若我今天想在A中使用B,首先我就必須先載入該組件,就像剛剛在script區塊載入外部的js檔案一樣的寫法
import ComponentA from '../src/components/A.vue'
接著在該組件加入components屬性
export default {
components: {
ComponentA
}
};
</script>
最後在template中使用
<template>
<div>
<component-a></component-a>
</div>
</template>
特別需要注意的是,不管你引入的組件是如何命名的,一旦你需要在template中使用,一律轉為kebab-case、小寫並以-相連
MyApp -> my-app
componentA -> component-a
今天我們介紹了SFC的基本結構與使用,之後我們搭建本地專案時,你會更清楚SFC的好處! 這裡就容我先賣個關子,我們明天再見囉:D 今天沒有demo,很輕鬆吧!
此文章同步發布於個人部落格,有興趣的大大也可以來參觀一下:D